2016-10-31 4 views
0

私は1対多の関係の1つに問題があります。 私の問題は、テナントをアパートメントに追加するときに、テナントの列の値をApartmentIDに設定しないことです。私は他のクラスとまったく同じ関係にあり、彼らはうまく働いています...なぜ誰にもわからないのですか? おかげjpa hibernate one-to-many双方向

アパート:

@Entity 
public class Apartment { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="ApartmentID",unique = true, nullable = false) 
    public int apartmentID; 

    @OneToMany(mappedBy = "apartment", cascade = CascadeType.ALL) 
    private List<Tenant> tenants; 
} 

テナント:あなたがここにすべてのコードを示していない

@Entity 
public class Tenant { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="TenantID",unique = true, nullable = false) 
    public int tenantID; 

    @ManyToOne 
    @JoinColumn(name = "ApartmentID") 
    private Apartment apartment; 
} 

答えて

0

あなたの双方向関係では、Tenantは関係の所有者です。 Apartmentを持続させているので、アパートテナントを手動で設定する必要があります。あなたは@OneToManyを変更手動設定を取り除きたい場合は、次のように:ところで

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name="ApartmentID",referencedColumnName="ApartmentID") 
private List<Tenant> tenants; 

、あなたの現在のサンプルで、あなたがアパートテナントを持続している場合。 アパートは自動的に保持されます。

0

。だから私はあなたの問題を正確に得ることができません。しかし、私はちょうどHibernate Many to One Bidirectional Mapping Annotation Exampleポストに従って、あなたのエンティティでプロジェクトをビルドします。

ここに私がアパートにテナントを追加する主なクラスがあります。

public static void main(String[] args) { 

     Tenant tenant = new Tenant(); 
     Apartment apartment = new Apartment(); 
     tenant.setApartment(apartment); 
     List<Tenant> tenants = new ArrayList<Tenant>(); 
     tenants.add(tenant); 
     apartment.setTenants(tenants); 

     Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 
     session.persist(apartment); 
     session.getTransaction().commit(); 

     session.close(); 
    } 

Hibernate設定

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.username">javabycode</property> 
     <property name="hibernate.connection.password">mypassword</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/javabycode</property> 
     <property name="show_sql">false</property> 
     <property name="hbm2ddl.auto">update</property>     
     <property name="format_sql">false</property> 
     <mapping class="com.javabycode.hibernate.model.Tenant"/> 
     <mapping class="com.javabycode.hibernate.model.Apartment"/>   
    </session-factory> 
</hibernate-configuration> 

にHibernate Utilの:

public class HibernateUtil { 
    private static final SessionFactory sessionFactory; 

    static { 
     try { 
      Configuration configuration = new Configuration(); 
      configuration.configure(); 
      ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() 
        .applySettings(configuration.getProperties()).build(); 
      sessionFactory = new Configuration().configure().buildSessionFactory(serviceRegistry); 
     } catch (Throwable ex) { 
      System.err.println("Session Factory could not be created." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

} 

それは仕事の罰金です! ApartmentIDにはすでにTanentテーブルの値が割り当てられています。

+0

あなたは値を両側に設定しているので、それをしたくありません。私がapartment.setTenants()を実行してそれを永続化/マージすると、そのフィールドのアパートに更新されたテナントが必要ですが、私はそうしません。ここで不思議なのは、私も住居と家主が1対1の関係を持ち、完璧に働いているということです。 もし私が望むのであれば私のモデルのペーストビンを追加することができますが、すべてが問題ないと確信しています – baskwo

関連する問題