엔티티가 User
및 Group
인데 이들 사이에 1 대 다수의 관계가 있기를 원한다고 가정합니다. 나는. 각 User
은 Group
에 속하며 Group
에는 많은 User
을 포함 할 수 있습니다.Java에서도 양방향 관계를 업데이트해야합니까?
그룹 엔티티 :
@Entity
@Table(name="GroupTable")
public class Group {
@Id
@Column(name="Id")
private long id;
@Column(name="Name")
private String name;
@OneToMany(mappedBy="group")
private Set<User> users;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
및 사용자 단체 :
@Entity
@Table(name="User")
public class User {
@Id
@Column(name="Id")
private long id;
@ManyToOne
@JoinColumn(name="GroupId")
private Group group;
@Column(name="Name")
private String name;
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
다음은 응용 프로그램 코드 :
public class App_Tester_Hibernate_01
{
private static Logger log = LoggerFactory.getLogger(App_Tester_Hibernate_01.class);
public static void main(String[] args)
{
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry serviceRegistry;
SessionFactory sessionFactory;
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session;
session = sessionFactory.openSession();
session.beginTransaction();
Group group;
User user;
group = (Group) session.byId(Group.class).load(1l);
if(group == null) {
group = new Group();
group.setId(1l);
group.setName("Group #1");
session.save(group);
}
log.info("Group.Users = {}", StringUtils.collectionToCommaDelimitedString(group.getUsers()));
user = (User) session.byId(User.class).load(1l);
if(user == null) {
user = new User();
user.setId(1l);
user.setName("Bob");
user.setGroup(group);
session.save(user);
}
log.info("Group.Users = {}", StringUtils.collectionToCommaDelimitedString(group.getUsers()));
user = (User) session.byId(User.class).load(2l);
if(user == null) {
user = new User();
user.setId(2l);
user.setName("Alice");
user.setGroup(group);
session.save(user);
}
log.info("Group.Users = {}", StringUtils.collectionToCommaDelimitedString(group.getUsers()));
user = (User) session.byId(User.class).load(3l);
if(user == null) {
user = new User();
user.setId(3l);
user.setName("Peter");
user.setGroup(group);
session.save(user);
}
log.info("Group.Users = {}", StringUtils.collectionToCommaDelimitedString(group.getUsers()));
session.update(group);
log.info("Group.Users = {}", StringUtils.collectionToCommaDelimitedString(group.getUsers()));
session.getTransaction().commit();
session.close();
}
}
Unfortunaley, getUser()
항상 null
을 반환합니다. 왜? 그것은 관련 사용자의 표현으로 설정되지 않습니까? 내가 뭘 잘못하고 있니?
직접 수집 동기화를 수행해야합니까? 최대 절전 모드로 필드를 자동으로 채우지 않습니까?
UPDATE 1
내 최대 절전 모드 설정은 다음과 같습니다
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/tester_hibernate_01</property>
<property name="connection.username">root</property>
<property name="connection.password">sa</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">false</property>
<property name="hibernate.query.substitution">true 1, false 0, yes 'Y', no 'N'</property>
<property name="hbm2ddl.auto">create</property>
<mapping class="test.Tester_Hibernate_01.Group"/>
<mapping class="test.Tester_Hibernate_01.User"/>
</session-factory>
</hibernate-configuration>
도움이되지 않았다
@OneToMany(mappedBy="group", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<User> users;
의 추가.
Hibernate.initialize(group);
도움이되지 않았다 추가 UPDATE 2
, getUsers()
은 여전히 null를 돌려줍니다.
그룹 엔티티를 연결하는 방법은 무엇입니까? –
은 두 저장 명령문 모두에 걸쳐 트랜잭션을 확장합니다. 또한 persistence-configuration (hibernate.cfg.xml 또는 사용하는 모든 것)을 커밋 할 수 있습니까? – cproinger
죄송합니다. 저장 문이 4 개 있습니다. 어느 것을 선택해야합니까? –