Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 hibernate две сущности в третьей через аннотации  [new]
am_sasa
Member

Откуда:
Сообщений: 713
Добрый день!

Можно ли сделать такое на аннотациях hibernate?
public class EntityA {
    @JoinColumn(name = "USER_FK")
    @OneToOne(fetch = FetchType.LAZY, optional = true)
    private User user;
	
    // пробовал так, entityB не грузит
    // @JoinColumn(name = "USER_FK", referencedColumnName = "USER_FK", insertable = false, updatable = false)
    private EntityB entityB;
}

public class EntityB {
    @JoinColumn(name = "USER_FK")
    @OneToOne(fetch = FetchType.LAZY, optional = true)
    private User user;
}

public class User {
    @Id
    @GeneratedValue(generator = "USER_SEQUENCE_GENERATOR")
    private Long id;
}
16 ноя 20, 16:25    [22233070]     Ответить | Цитировать Сообщить модератору
 Re: hibernate две сущности в третьей через аннотации  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
am_sasa,

Один к одному это не FK
16 ноя 20, 17:57    [22233184]     Ответить | Цитировать Сообщить модератору
 Re: hibernate две сущности в третьей через аннотации  [new]
am_sasa
Member

Откуда:
Сообщений: 713
PetroNotC Sharp
am_sasa,

Один к одному это не FK

Все правильно, подправил.

На просторах инета нашел такое решение:
@JoinColumnsOrFormulas({
   @JoinColumnOrFormula(formula=
	@JoinFormula(value = "(SELECT e.id FROM EntityB e WHERE e.USER_FK = USER_FK)", referencedColumnName = "id"))
})
private EntityB entityB;
работает
17 ноя 20, 14:11    [22233733]     Ответить | Цитировать Сообщить модератору
 Re: hibernate две сущности в третьей через аннотации  [new]
faustgreen
Member

Откуда:
Сообщений: 406
Если там все связи один к одному, то оно вроде и так работает:

Java:
+
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Persistence;
import javax.persistence.Table;

public class Test {
	public static void main(String[] args) {
		
		EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PersistanceUnitName");
		EntityManager entityManager = entityManagerFactory.createEntityManager();
		entityManager.getTransaction().begin();
		
		User user1 = new User();
		User user2 = new User();
		user1.setName("User1");
		user2.setName("User2");
		
		EntityA entityA = new EntityA();
		EntityB entityB = new EntityB();
		
		entityB.setName("EntityB");
		entityB.setUser(user2);
		
		entityA.setName("EntityA");
		entityA.setUser(user1);
		entityA.setEntityB(entityB);
		
		entityManager.persist(entityA);
		
		entityManager.getTransaction().commit();
		entityManager.close();
		entityManagerFactory.close();

	}
}

@Entity(name = "EntityA")
@Table(name = "EntitiesA")
class EntityA {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
	@OneToOne(cascade = CascadeType.PERSIST)
	@JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;
	@OneToOne(cascade = CascadeType.PERSIST)
	@JoinColumn(name = "entityb_id", insertable = false, updatable = false)
    private EntityB entityB;
	private String name;

    public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public EntityB getEntityB() {
		return entityB;
	}
	public void setEntityB(EntityB entityB) {
		this.entityB = entityB;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Long getId() {
		return id;
	}
    
}

@Entity(name = "EntityB")
@Table(name = "EntitiesB")
class EntityB {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
	@JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;
    private String name;

	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Long getId() {
		return id;
	}
    
}

@Entity(name = "User")
@Table(name = "Users")
class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

	public Long getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
    
}


Database:
+
CREATE TABLE `entitiesa` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `entityb_id` bigint(20) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKs39jadgpbiwlu4ot4g4hya1bx` (`entityb_id`),
  KEY `FKdvwmvgd04gat1yr3j4vy4abi6` (`user_id`),
  CONSTRAINT `FKdvwmvgd04gat1yr3j4vy4abi6` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
  CONSTRAINT `FKs39jadgpbiwlu4ot4g4hya1bx` FOREIGN KEY (`entityb_id`) REFERENCES `entitiesb` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `entitiesb` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKm378mtk9ceppwy60dok40bowk` (`user_id`),
  CONSTRAINT `FKm378mtk9ceppwy60dok40bowk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
17 ноя 20, 14:42    [22233795]     Ответить | Цитировать Сообщить модератору
 Re: hibernate две сущности в третьей через аннотации  [new]
faustgreen
Member

Откуда:
Сообщений: 406
Хотя тут я так понимаю EntityA.User = EntityA.EntityB.User.
17 ноя 20, 15:23    [22233862]     Ответить | Цитировать Сообщить модератору
 Re: hibernate две сущности в третьей через аннотации  [new]
am_sasa
Member

Откуда:
Сообщений: 713
faustgreen
Хотя тут я так понимаю EntityA.User = EntityA.EntityB.User.

в общем это понятно, однако поля "entityb_id" не должно быть, у нас только "USER_FK".
17 ноя 20, 15:44    [22233888]     Ответить | Цитировать Сообщить модератору
 Re: hibernate две сущности в третьей через аннотации  [new]
faustgreen
Member

Откуда:
Сообщений: 406
[quot am_sasa#22233733]
PetroNotC Sharp
am_sasa,
На просторах инета нашел такое решение:
@JoinColumnsOrFormulas({
   @JoinColumnOrFormula(formula=
	@JoinFormula(value = "(SELECT e.id FROM EntityB e WHERE e.USER_FK = USER_FK)", referencedColumnName = "id"))
})
private EntityB entityB;
работает


У меня пример заработал с
@JoinFormula(value = "(SELECT e.id FROM EntityB e WHERE e.USER_FK = USER_FK)", referencedColumnName = "id"))
.
@JoinColumnsOrFormulas помойму лишняя.

Правда работает только в паре с @ManyToOne.
Кто нибудь вкурсе @JoinFormula + @OneToOne работают ?
17 ноя 20, 20:01    [22234128]     Ответить | Цитировать Сообщить модератору
 Re: hibernate две сущности в третьей через аннотации  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
faustgreen,
Если модель в бд логичная. То все будет работать.
От бд надо идти.
Схему бд рисовать
17 ноя 20, 20:28    [22234153]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить