4

Hibernateで読み取り専用列を強制する方法がわかりません。

idgroupを読み取り専用列に設定したいと思います。設定insertable=falseupdatable=falseて、休止状態のSQLで、次のように読み取ることができます。

Hibernate: insert into groups (description, name, account_idaccount, idgroup) values (?, ?, ?, ?) 

しかし、私は取得したいと思います:

insert into groups (description, name, account_idaccount) values (?, ?, ?) 

これが私のクラスです:

@Entity
@Table(name = "groups")
public class Group implements java.io.Serializable {

private static final long serialVersionUID = -2948610975819234753L;
private GroupId id;
private Account account;
private String name;
private String description;

@EmbeddedId
@AttributeOverrides({@AttributeOverride(name = "idgroup", column = @Column(name = "idgroup", insertable = false)),
        @AttributeOverride(name = "accountIdaccount", column = @Column(name = "account_idaccount", nullable = false))})
public GroupId getId() {
    return id;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "account_idaccount", nullable = false, insertable = false, updatable = false)
public Account getAccount() {
    return account;
}

@Column(name = "description", length = 512)
public String getDescription() {
    return description;
}


@Column(name = "name", nullable = false, length = 128)
public String getName() {
    return name;
}
..
}
@Embeddable
public class GroupId implements java.io.Serializable {

private int idgroup;
private int accountIdaccount;

@Column(name = "idgroup", insertable= false, updatable= false)
public int getIdgroup() {
    return this.idgroup;
}


@Column(name = "account_idaccount", nullable = false)
public int getAccountIdaccount() {
    return this.accountIdaccount;
}
..
}

DBMSのid自動生成を利用できるため、idgroupの読み取り専用列が必要です。クラスターセーフではないため、Hibernateでキー自動生成を使用したくありません。

4

5 に答える 5

13

@Column注釈を次のようにマークできると思いますupdatable=false

于 2013-01-31T13:05:32.047 に答える
2

簡単:

@Column(insertable = false, updatable = false)
于 2019-03-03T00:46:06.707 に答える
0

これは、2つのDAOオブジェクトを使用して実現できました。私はそれが好まれないかもしれないことを知っています、しかし私はそれを回避する別の方法を見ませんでした。フィールドを設定し、挿入SQLから列を削除insertable=falseupdatable=falseないようにして、Postgresがdefaultそれらの列値を設定するアクションを呼び出さないようにします。

   // GroupWrite

   @Entity
   @Table(name = "group")
   public class GroupWrite {

      @Id
      @Column(name = "account")
      private Account account;

      @Column(name = "name")
      private String name;

      @Column(name = "description")
      private String description;


      /* Getters and Setters */
  }

-

   // GroupRead

   @Entity
   @Table(name = "group")
   public class GroupRead {

      @EmbeddedId
      @Column(name = "id")
      private GroupId id;

      @Column(name = "account")
      private Account account;

      @Column(name = "name")
      private String name;

      @Column(name = "description")
      private String description;


      /* Getters and Setters */
  }

次に、クエリを使用するとき、またはクエリを実行するGroupReadときにを使用する必要があります。selectGroupWriteinsertupdate

両方の属性を一般的な方法で使用する場合は、重複するフィールドを記述するインターフェースを実装できます。

   public interface Group {

        Account getAccount();

        void setAccount(Account account);
   }

   public class GroupWrite implements Group {...}

   public class GroupRead implements Group {...}

お役に立てれば。

于 2019-12-02T14:35:31.047 に答える
-2

解決策は、のようなプリミティブIntegerではなく、のようなラッパークラスを使用することです。Hibernateがnullポインターを取得すると、IDの生成をDBMSに委任します。int

于 2013-02-18T13:49:29.683 に答える
-3

この場合、@ReadOnlyPropertyアノテーションが役立ちます。

于 2015-08-18T09:14:34.380 に答える