programing

JPA Join Column vs mappedBy

itsource 2022. 8. 8. 17:26
반응형

JPA Join Column vs mappedBy

다음 중 어떤 차이가 있습니까?

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
    private List<Branch> branches;
    ...
}

그리고.

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, 
    mappedBy = "companyIdRef")
    private List<Branch> branches;
    ...
}

이 항목을 보강 주석@JoinColumn이 엔티티가 관계의 소유자임을 나타냅니다(즉, 대응하는 테이블에는 참조 테이블에 대한 외부 키가 있는 열이 있습니다).mappedBy관계의 이 쪽에서 주체는에서 역 것이다. 가게 주인은" 다른"실체에 살고 있음을 나타냅니다.이 쪽의 엔티티가 관계의 역수이며 소유자가"기타"엔티티에 있음을 나타냅니다.이것은 또한 여러분이"mappedBy"(완전히 관계 양방향).즉과 주석이 달린 것에서"mappedBy"(완전 양방향 관계)로 주석을 붙인 클래스에서 다른 테이블에 액세스할 수 있습니다 다른 테이블에 액세스 할 수 있다는 것을 의미한다.

특히 질문의 코드에 대해 올바른 주석은 다음과 같습니다.

@Entity
public class Company {
    @OneToMany(mappedBy = "company",
               orphanRemoval = true,
               fetch = FetchType.LAZY,
               cascade = CascadeType.ALL)
    private List<Branch> branches;
}

@Entity
public class Branch {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyId")
    private Company company;
}

@JoinColumn 양쪽 관계에서 사용될 수 있습니다.그 질문은 '사용법'에 관한 것이었다.@JoinColumn그 에서에@OneToManyside(대소문자)여기서 포인트는 물리정보 복제(컬럼명)와 최적화되지 않은 SQL 쿼리에 있습니다.이러한 쿼리는 몇 가지 추가 문을 생성합니다.

설명서에 따르면:

JPA 사양에서는 많은1이 쌍방향 관계의 소유자측이기 때문에 1 대 다의 관련성은 다음과 같이 주석을 붙입니다.@OneToMany(mappedBy=...)

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
} 

TroopA1대 다의쌍방향 관계를 가지다와 많은 관계에 양방향 1.Soldier주한 미군의 속성을 통해.부대 소유지를 통해서요 당신은( 하지 말아야 할)은물리 매핑을 정의할필요가 없습니다(필요 없음)에 어떠한 물리적 매핑을 정의할 필요가 없다.mappedByside.쪽.

1 대의 쌍방향 측을 소유 측으로 하여 1 대 다에 매핑하려면mappedBy요소와 하나 요소를이 대다수의 사람들을 세웠다 것을 1로 설정한다 많은 설정하고.@JoinColumn~하듯이로insertable ★★★★★★★★★★★★★★★★★」updatable , 추가 솔루션이 생성됩니다.UPDATE★★★★★★★★★★★★★★★★★★.

@Entity
public class Troop {
    @OneToMany
    @JoinColumn(name="troop_fk") //we need to duplicate the physical information
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk", insertable=false, updatable=false)
    public Troop getTroop() {
    ...
}

단방향 1대 다 어소시에이션

「 」를하고 있는 는,@OneToMany을 붙입니다.@JoinColumn 후 와의 어소시에이션과 PostPostComment.

Unidirectional one-to-many association

단방향 1 대 다의 어소시에이션을 사용하는 경우, 어소시에이션은 부모측만 매핑합니다.

예에서는, 「」만,Post@OneToMany와의 PostComment★★★★★★★★★★★★★★★★★★:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();

쌍방향 1대 다 어소시에이션

「 」를하고 있는 는,@OneToManymappedBy쌍방향 어소시에이션이 설정되어 있는 경우.예에서는, 「」와「」의 모두,Post에는 「의.PostComment 엔티티 및자 엔티티PostComment를 가지고 .Post엔티티:

Bidirectional one-to-many association

서서 PostComment 「」,post을 사용법

@ManyToOne(fetch = FetchType.LAZY)
private Post post;

「」를으로 .fetch FetchType.LAZY '모든'이@ManyToOne ★★★★★★★★★★★★★★★★★」@OneToOne어소시에이션이 정상적으로 취득되어 N+1 쿼리 문제가 발생할 수 있습니다.

서서 Post 「」,comments어소시에이션은 다음과 같이 매핑됩니다.

@OneToMany(
    mappedBy = "post",
    cascade = CascadeType.ALL,
    orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();

mappedBy「」의 @OneToMany에서는, 「」을 참조하고 .post PostComment와 같이 엔티티에서는 이 「」, 「」에 의해 어소시에이션이 됩니다.@ManyToOne 키 값 합니다.side: side side 、 side side 、 side side side side 。

는 두 , 예를 들어 2가지 효용방법도'가합니다.addChild ★★★★★★★★★★★★★★★★★」removeChild:

public void addComment(PostComment comment) {
    comments.add(comment);
    comment.setPost(this);
}

public void removeComment(PostComment comment) {
    comments.remove(comment);
    comment.setPost(null);
}

이러한 2개의 방법에 의해, 쌍방향 어소시에이션의 양쪽이 동기하고 있는 것이 보증됩니다.양쪽 끝을 동기화하지 않으면 최대 절전 모드가 연결 상태 변경이 데이터베이스에 전파되는 것을 보장하지 않습니다.

어떤 걸 고를까요?

" " "@OneToMany어소시에이션의 퍼포먼스가 그다지 좋지 않기 때문에, 회피할 필요가 있습니다.

것이 .@OneToMany을 사용하다

mappedBy 주석은 항상 양방향 관계의 상위측(회사 클래스)에서 사용해야 합니다. 이 경우 주석은 하위 클래스(분기 클래스)의 멤버 변수 '회사'를 가리키는 회사 클래스여야 합니다.

주석 @JoinColumn은 엔티티 어소시에이션에 가입하기 위한 매핑 컬럼을 지정하기 위해 사용됩니다.이 주석은 임의의 클래스(부모 클래스 또는 자녀 클래스 중 하나)에서 사용할 수 있지만, 이 경우 양방향 관계의 자녀측(브랜치 클래스)에서 사용할 수 있습니다.분기 클래스의 외부 키를 나타내는 힙.

다음으로 작업 예를 나타냅니다.

부모 클래스, 회사

@Entity
public class Company {


    private int companyId;
    private String companyName;
    private List<Branch> branches;

    @Id
    @GeneratedValue
    @Column(name="COMPANY_ID")
    public int getCompanyId() {
        return companyId;
    }

    public void setCompanyId(int companyId) {
        this.companyId = companyId;
    }

    @Column(name="COMPANY_NAME")
    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="company")
    public List<Branch> getBranches() {
        return branches;
    }

    public void setBranches(List<Branch> branches) {
        this.branches = branches;
    }


}

아이 클래스, 브런치

@Entity
public class Branch {

    private int branchId;
    private String branchName;
    private Company company;

    @Id
    @GeneratedValue
    @Column(name="BRANCH_ID")
    public int getBranchId() {
        return branchId;
    }

    public void setBranchId(int branchId) {
        this.branchId = branchId;
    }

    @Column(name="BRANCH_NAME")
    public String getBranchName() {
        return branchName;
    }

    public void setBranchName(String branchName) {
        this.branchName = branchName;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="COMPANY_ID")
    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }


}

나는 여기서 Oscar Lopez에 의해 받아들여진 답변에 동의하지 않는다.정답이 틀렸어요!

.@JoinColumn이는 이 엔티티가 관계의 소유자임을 나타냅니다. 대신 , 아, 아'입니다.@ManyToOne이데올로기 때문에

다음과 같은 관계 주석@ManyToOne,@OneToMany ★★★★★★★★★★★★★★★★★」@ManyToManyJPA/Hibernate에 매핑을 작성하도록 지시합니다.기본적으로는 이 작업은 별도의 Join Table을 통해 수행됩니다.


@Join Column

★★★의 @JoinColumn결합 컬럼이 아직 존재하지 않는 경우 이를 작성합니다.이 경우 이 주석을 사용하여 조인 열의 이름을 지정할 수 있습니다.


매핑 기준

MappedBy파라미터는 JPA에 지시하는 것입니다.이 관계는 이미 이 관계의 반대 엔티티에 의해 매핑되고 있기 때문에 다른 조인 테이블을 작성하지 마십시오.



MappedBy는 관계 주석의 속성으로, 2개의 엔티티를 관련짓는 메커니즘을 생성하는 것을 목적으로 합니다.이 두 엔티티는 기본적으로 결합 테이블을 생성하여 관련짓습니다. MappedBy이 프로세스를 한 방향으로 정지시킵니다.

" " " 를 하지 않습니다.MappedBy는 이 관계의 소유자로 간주됩니다.이는 매핑의 메커니즘이 외부 키필드에 대한 3개의 매핑 주석 중 하나를 사용하여 클래스 내에서 지정되기 때문입니다.이는 매핑의 특성을 지정할 뿐만 아니라 조인 테이블의 작성도 지시합니다.또한 외부 키 위에 @JoinColumn 주석을 적용하여 조인 테이블을 억제하는 옵션도 존재합니다.이것에 의해, 외부 키는 오너 엔티티의 테이블내에 보관 유지됩니다.

요약하면요, 음음음음 so so so so so so so so so so so 。@JoinColumn는 신규 컬럼의 , 「참가자」는, 「참가자」의 어느 쪽인가 하면, 「참가자」는, 「참가자」의 어느쪽인가를 .MappedBy파라미터는 다른 (자)클래스의 관계 주석과 연계하여 결합 테이블을 통해 또는 오너 엔티티의 관련 테이블에 외부 키 컬럼을 작성함으로써 매핑을 작성합니다.

방법을 설명하다MapppedBy동작합니다.아래의 코드를 참조해 주세요.한다면MappedBy파라미터를 삭제하면 휴지 상태에서는 실제로는 2개의 결합 테이블이 생성됩니다.왜냐하면 다대다 관계에는 대칭이 존재하기 때문에 휴지 상태에서는 한쪽 방향을 선택할 근거가 없기 때문입니다.

따라서,MappedBy휴지 상태(Hibernate)에 전달하기 위해 우리는 두 개체 간의 관계 매핑을 지시하도록 다른 개체선택했습니다.

@Entity
public class Driver {
    @ManyToMany(mappedBy = "drivers")
    private List<Cars> cars;
}

@Entity
public class Cars {
    @ManyToMany
    private List<Drivers> drivers;
}

@JoinColumn(이름 = "드라이버) 추가 중소유자 클래스(아래 참조)에 있는 ID)는 조인 테이블 작성을 금지하고 대신 드라이버를 만듭니다.매핑을 구성하기 위해 Cars 테이블의 ID 외부 키 열:

@Entity
public class Driver {
    @ManyToMany(mappedBy = "drivers")
    private List<Cars> cars;
}

@Entity
public class Cars {
    @ManyToMany
    @JoinColumn(name = "driverID")
    private List<Drivers> drivers;
}

덧붙이고 싶은 말이 있는데@JoinColumn이 답변에서 알 수 있듯이 반드시 물리정보의 위치와 관련지을 필요는 없습니다.조합할 수 있다@JoinColumn와 함께@OneToMany상위 테이블에 하위 테이블을 가리키는 테이블 데이터가 없는 경우에도 마찬가지입니다.

JPA에서 단방향 일대다 관계를 정의하는 방법

단방향 OneToMany, Inverse ManyToOne, Join 테이블 없음

에서만 이용할 수 있는 것 같습니다.JPA 2.x+그래도.자식 클래스에 전체 참조가 아닌 부모의 ID만 포함하려는 경우에 유용합니다.

간단하게 해드릴게요.
매핑에 관계없이 양쪽에서 @JoinColumn을 사용할 수 있습니다.

이것을 세 가지 경우로 나눕시다.
1) 지점과 회사의 단방향 매핑.
2) 회사에서 지점까지의 양방향 매핑.
3) 회사에서 지사로의 단방향 매핑만.

따라서 모든 사용 사례는 이 세 가지 범주에 속합니다.그럼 @JoinColumnmappedBy 사용 방법에 대해 설명하겠습니다.
1) 지점과 회사의 단방향 매핑.
분기 테이블에서 Join Column을 사용합니다.
2) 회사에서 지점까지의 양방향 매핑.
@Mykhaylo Adamovich의 답변에 따라 Company 테이블에서 mappedBy를 사용합니다.
3) Company에서 Branch로의 단방향 매핑.
Company 테이블에서 @JoinColumn을 사용합니다.

@Entity
public class Company {

@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
@JoinColumn(name="courseId")
private List<Branch> branches;
...
}

브랜치 테이블의 외부 키 "courseId" 매핑을 기반으로 모든 브랜치 목록을 가져오라고 합니다.메모: 이 경우 회사에서 지사로 회사를 가져올 수 없습니다. 회사 간 단방향 매핑만 존재합니다.

JPA는 계층화된 API이며, 각 레벨에는 자체 주석이 있습니다.가장 높은 레벨은 (1) 엔티티 레벨로 영속적인 클래스를 기술하고 (2) 엔티티가 관계형 데이터베이스에 매핑되어 있다고 가정하는 관계형 데이터베이스 레벨과 (3) 자바 모델이 있습니다.

레벨 1 주석:@Entity,@Id,@OneToOne,@OneToMany,@ManyToOne,@ManyToMany이러한 높은 수준의 주석만 사용하여 응용 프로그램에 지속성을 도입할 수 있습니다.그러나 그런 다음 JPA의 가정에 따라 데이터베이스를 작성해야 합니다.이러한 주석은 도면요소/관계 모델을 지정합니다.

레벨 2 주석:@Table,@Column,@JoinColumn, ... JPA의 기본값이 만족스럽지 않거나 기존 데이터베이스에 매핑해야 하는 경우 엔티티/속성에서 릴레이셔널 데이터베이스 테이블/컬럼으로의 매핑에 영향을 줍니다.이러한 주석은 구현 주석으로 볼 수 있으며 매핑을 수행하는 방법을 지정합니다.

내 생각에는 가능한 한 높은 수준의 주석을 고수하고 필요에 따라 낮은 수준의 주석을 도입하는 것이 가장 좋다.

대한 : " " " " 에 to to to to to to :@OneToMany/mappedBy는 엔티티 도메인의 주석만 사용하기 때문에 가장 적합합니다.@oneToMany/@JoinColumn에서도 문제가 없지만 반드시 필요하지 않은 구현 주석을 사용합니다.

언급URL : https://stackoverflow.com/questions/11938253/jpa-joincolumn-vs-mappedby

반응형