JPA:エンティティのマッピングで繰り返す列

ピット:この新しいエンティティクラスから(新 - ..テーブルからJPAエンティティ)

1は、(効果キーワードのみ非読み、そこつの非読み取り専用でなければなりませんのために定義されたマッピングこの①A②少なくとも非読み取り専用の列がなければならない旨のタイトルです:おそらく3つのエラー原因以下のような間違った③updateがある旨の主キーフィールド)、。

このため、エラーのすべて。

あなたは、このようなエンティティを生成すると、次の問題に注意を払う必要があります。

このテーブルは、選択されたので、ref_teacher_student:リレーションシップ対応するテーブルと一緒に保存されている必要があり、多くの団体がある場合(、学生がより多くの教師が複数の生徒の教師を持っているが)、この時点では、その確認のテーブル名にします本当の実体を生成しませんが、そのようなjoin_table関係を構築します。

以下の理由により誤りに上記一方のタイトル:

通り:主キーは学生証+コースのID、時間が内部で選択科目表、JPAは自動的にStudentClassPK主キークラス、内部のSIDを作成し、(挿入可能= falseの場合、更新可能な=偽)この1を含む、そしてもちろんで選択テーブルは、対応するCIDエンティティは、プライマリキーと関連付けられた属性、ならびに学生のクラスオブジェクトと、に加えての(挿入=偽、更新可能=偽)はJoinColumnがない場合。

このような直接的な操作は、タイトルにエラーが発生します。

挿入可能= falseの場合、更新可能な= falseを持つJoinColumnの内部の場合は、2番目のエラーが生成されます

上記の問題を解決する方法は、登録エンティティに対応する挿入=偽、更新可能な=偽変更テーブルのPK、およびそれ以降の学生クラスオブジェクトJoinColumnの内部です。

上記(ここでコードユーザーの試験例)以下のコードADMINない関係テーブルと他のテーブルを解決した後、それに参加しませんでした

自動的に接触した後に発生しました:

自動的にエンティティクラスを生成した後:

以UserTest为例,说明关于insertable=false的修改

package entity;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the user_test database table.
 * 
 */
@Entity
@Table(name="user_test")
@NamedQuery(name="UserTest.findAll", query="SELECT u FROM UserTest u")
public class UserTest implements Serializable {
	private static final long serialVersionUID = 1L;

	@EmbeddedId
	private UserTestPK id;

	private int issubmit;

	private int score;

	//bi-directional many-to-one association to Test
	@ManyToOne
	@JoinColumn(name="tid",insertable=false, updatable=false)
	private Test test;

	//bi-directional many-to-one association to User
	@ManyToOne
	@JoinColumn(name="uid",insertable=false, updatable=false)
//这里的insertable=false等原来在PK类里面的uid和tid里面
	private User user;

	public UserTest() {
	}

	public UserTestPK getId() {
		return this.id;
	}

	public void setId(UserTestPK id) {
		this.id = id;
	}

	public int getIssubmit() {
		return this.issubmit;
	}

	public void setIssubmit(int issubmit) {
		this.issubmit = issubmit;
	}

	public int getScore() {
		return this.score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	public Test getTest() {
		return this.test;
	}

	public void setTest(Test test) {
		this.test = test;
	}

	public User getUser() {
		return this.user;
	}

	public void setUser(User user) {
		this.user = user;
	}

}
package entity;

import java.io.Serializable;
import javax.persistence.*;

/**
 * The primary key class for the user_test database table.
 * 
 */
@Embeddable
public class UserTestPK implements Serializable {
	//default serial version id, required for serializable classes.
	private static final long serialVersionUID = 1L;

	@Column()
	private int tid;

	@Column()
//这里自动生成的时候有insertable=false等
	private String uid;

	public UserTestPK() {
	}
	public int getTid() {
		return this.tid;
	}
	public void setTid(int tid) {
		this.tid = tid;
	}
	public String getUid() {
		return this.uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}

	public boolean equals(Object other) {
		if (this == other) {
			return true;
		}
		if (!(other instanceof UserTestPK)) {
			return false;
		}
		UserTestPK castOther = (UserTestPK)other;
		return 
			(this.tid == castOther.tid)
			&& this.uid.equals(castOther.uid);
	}

	public int hashCode() {
		final int prime = 31;
		int hash = 17;
		hash = hash * prime + this.tid;
		hash = hash * prime + this.uid.hashCode();
		
		return hash;
	}
}

注意:本质上User和Test、User和Submit(对应TEST的SUBMIT)都是多对多关系,为啥拆成两个一对多,在中间加上了UserTest和UserSubmit是因为需要保存一些值,如时间、分数等,Test和Question是多对多,是因为没有保存这些关联时的一些属性,如时间等。

因此,对于数据库表的设计,更多的是看所谓的实际需要,没有绝对的关联关系和表结构设计,只要是合理的,那么就应该给予支持。

发布了32 篇原创文章 · 获赞 5 · 访问量 4655

おすすめ

転載: blog.csdn.net/qq_38941327/article/details/100547207