0

私はこのマッピングを持っています:

エンティティ 1 エンティティ 2 エンティティ 3

そしてエンティティ4

エンティティ番号1、2、および3には、エンティティ4のリストがあります。エンティティ4には、文字列(DATA)と@Idおよび@GeneratedValueに設定されたIDの2つのフィールドしかありません

Entity 4 データを保持するデータベース テーブルで、String(DATA) を複製したくありません。

ただし、エンティティ 1、2、および 3 は、それらの間でエンティティ 4 のリストに重複データを持つことができます。

例 (インスタンスは、指定されたエンティティのオブジェクトです):

Instance 1 (Entity 1): List: ["hi","hello","music"]
Instance 2 (Entity 2): List: ["tv","hi","sofa"]
Instance 3 (Entity 2): List: ["sofa","wii"]
Instance 4 (Entity 3): List: ["music","otherString"];

エンティティ 4 のデータベース テーブル エントリは次のとおりです
。ID 文字列
1 hi
2 hello
3 music
4 tv
5 sofa
6 wii
7 otherString

私が得ているのは:
ID 文字列
1 こんにちは
2 こんにちは
3 音楽
4 テレビ 5 こんにちは 6 ソファ
7 ソファ 8 wii
9 音楽
10 otherString

データが複製されます。@Id アノテーションを使用してフィールド文字列を指定しようとすると、エンティティ 1、2、または 3 のインスタンスをリストに既に存在する文字列で保存しようとすると、エンティティ 4 の重複エントリ エラーが送信されます。エンティティ 1、2、または 3 を保存しないでください。

これに正しく注釈を付けるにはどうすればよいですか?

私のコードの一部:

エンティティ 1、2、または 3 (コードのこの部分ではすべて同じです):

@Entity
 public class Entity1 {
      private List<Entity4> entity4List;

       @OneToMany(targetEntity=Entity4.class,cascade =CascadeType.ALL)
        public List<Entity4> getEntity4List() {
         return entity4List;
       }
    }

エンティティ 4:

@Entity
 public class Entity4 {

    private long id;
      private String stringn;

      @Id
      @GeneratedValue
       public long getId() {
        return id;
       }
     }

そして、エンティティ 1、2、または 3 を保存する Hibernate コード:

public void addEntity1(ArrayList<String> list){
List<Entity4> L = new ArrayList<Entity4>();
for(String s:list)
{
    L.add(new Entity4(s));
 }
  Entity1 e=new Entity1(L);
   Session session = sf.getCurrentSession();
       session.beginTransaction();
    session.save(e);
     session.getTransaction().commit();
 }
4

1 に答える 1

0

Entity4 のデータ フィールドが一意である必要がある場合は、データベース内の対応する列に対して一意の制約が必要です。

また、コード内で重複する Entity4 インスタンスを作成しないようにするには、次のことを行う必要があります。

  • このデータ フィールドを持つ Entity4 インスタンスのデータベースを検索します
  • 既に存在する場合は、Entity1 (または 2、または 3) のリストに追加します。
  • 存在しない場合は、新しいものを作成し、Entity1 (または 2、または 3) のリストに追加します。

entity4 が存在するかどうかを 2 つのスレッドが同時にチェックし、それらの 2 つのスレッドが同時に新しいエンティティを作成する場合があることに注意してください。これにより、データベースの一意の制約により、スレッドの 1 つで例外が発生します。

于 2012-06-23T06:23:19.663 に答える