2

私はJava EE 6を使用しています。最初にそれを捨てたいだけです
。関係は次のとおりです。Acustomerは複数持つことができますfacility
ここに顧客クラスがあります

@Entity
public class Customer {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;
     private String name;
     @OneToMany(cascade=CascadeType.ALL)
     @JoinColumn(name="CUSTOMER_FK", nullable=false)
     private List<Facility> facilities;

     public Customer(){
          facilities = new ArrayList<Facility>();
     }

     public Customer(Long id, String name, List<Facility> facilities) {
          this.id = id;
          this.name = name;
          this.facilities = facilities;
     }
     //set and get method
     ...

     public void addFacility(Facility facility){
          this.facilities.add(facility);
     }
}

施設クラスはこちら

@Entity
public class Facility {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;
     private String name;

     public Facility(){}

     public Facility(Long id, String name, Address address, List<Project> project) {
          this.id = id;
          this.name = name;
     }

     //Set and get method
     ...
}

私がこれを持っていれば、メインで今、それはうまくいきます。これが私のデータベースに挿入されるのを見ることができます

Customer customer = new Customer();
customer.setName("Wake Forest University");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EntityLibraryPU");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(customer);
tx.commit();

ただし、機能を追加して FK 制約を強制しようとするとすぐに。物事が壊れ始めます。

Customer customer = new Customer();
customer.setName("Wake Forest University");
Facility facility = new Facility();
facility.setName("Xia");
customer.addFacility(facility);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EntityLibraryPU");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(customer);
tx.commit();

これがエラーです。最初に、同じ "Wake Forest University" の顧客が CUSTOMER テーブルに挿入されます (name属性が一意に設定されていないため、一度に 2 つのエントリがデータベースに挿入されます)。ただし、FACILITY テーブルには何も挿入されません。理由はありますか?エラー コードの 1 つは ですField 'customer_fk' doesn't have a default value。多分それはあなたたちに少しヒントを与えることができます. 何も思いつきません。エラーログを調べるとCall: INSERT INTO FACILITY (ID, NAME, STREET2, STREET1, ZIPCODE, STATE, CITY, COUNTRY) VALUES (?, ?, ?, ?, ?, ?, ?, ?)bind => [2, Xia, null, null, null, null, null, null]、私のFACILITYテーブルにはフィールドがありCUSTOMER_FK、との間に1対多の関係を強制しようとすると作成されますが、クエリはそのフィールドに何も挿入しませんCUSTOMERFACILITY

4

2 に答える 2

2

最初に、同じ「Wake Forest University」顧客の 2 倍を CUSTOMER テーブルに挿入します。

nameエンティティの一意性制約を定義していないため、Customerこれを妨げるものは何もありません (ただし、両方のレコードの PK は異なります)。の一意性を強制する場合はname、一意の制約を設定します。

@Column(unique=true)
String name;

エラー コードの 1 つは、フィールド 'customer_fk' に既定値がありません。

コメントされた行は「有罪」だと思います:

tx.begin();
em.persist(customer);
//em.persist(facility); //DON'T DO THIS
tx.commit();

Customerまず、施設は顧客について何も知らないため (これは からへの一方向の関連付けですFacitlity)、JPA は FK を設定できず、エラー メッセージが表示されます。

第 2 に、 toからすべての操作をカスケードしているため(注釈内の を使用) 、インスタンスは必要ありません。CustomerFacilitycascade=CascadeType.ALL@OneToManypersistfacility

facilityしたがって、インスタンスで永続化を呼び出さないでください。JPA がcustomer.

于 2010-06-24T18:23:07.747 に答える
1

列に一意の制約がないため、重複した名前の顧客が得られますname。そのため、2 番目のテストを実行すると、同じ名前の顧客が再度追加されます。顧客名に追加unique=trueすると、列が一意になるように強制されます。次に、同じ名前の 2 番目の顧客を作成できないという問題が発生します。

ファシリティは、顧客を保存するときにカスケードにも保存されるため、明示的に保存する必要はありません。

実際、独自のテーブルがないため、ファシリティを直接永続化することもできません。を使用して@JoinColumn、Customer と Facility の間の結合テーブルの使用を削除し、顧客の外部キーを Facility テーブルに配置します。@JoinColumn を削除すると、CUSTOMER_FACILITY のような追加の結合テーブルが表示されます。これには、顧客と施設のマッピングが格納されます。その後、ファシリティを個別に永続化できます。

于 2010-06-24T18:06:14.330 に答える