0

엔티티가 UserGroup인데 이들 사이에 1 대 다수의 관계가 있기를 원한다고 가정합니다. 나는. 각 UserGroup에 속하며 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를 돌려줍니다.

답변

1

interessting 예 : 그룹 엔티티가 사용자를 저장하는 시점에 분리되어 2 개의 트랜잭션을 사용하고 있으므로 업데이트되지 않습니다. (실제로 최대 절전 모드가 연결되어있는 경우이를 알아낼 수 있다면 당신이 그것을 시도하면 그렇게 생각하지 마라) 나에게 알렸다. 사용자가 그룹 엔티티의 콜렉션에 사용자를 추가 한 다음 플러시하여 사용자 엔티티에 ID가 할당되도록 할 수 있습니다. 그러나 그룹 엔티티 (http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-cascade)의 콜렉션 필드에 적절한 캐스케이드 (cascade) 주석을 추가하면됩니다.

+0

그룹 엔티티를 연결하는 방법은 무엇입니까? –

+0

은 두 저장 명령문 모두에 걸쳐 트랜잭션을 확장합니다. 또한 persistence-configuration (hibernate.cfg.xml 또는 사용하는 모든 것)을 커밋 할 수 있습니까? – cproinger

+0

죄송합니다. 저장 문이 4 개 있습니다. 어느 것을 선택해야합니까? –