programing

inversedBy와 mappedBy의 차이점은 무엇입니까?

goodjava 2022. 12. 10. 10:50

inversedBy와 mappedBy의 차이점은 무엇입니까?

Zend Framework 2와 독트린 2를 사용하여 어플리케이션을 개발하고 있습니다.

때, 는 석을동과 , while while while while while 의 차이를 이해할 수 없다.mappedBy ★★★★★★★★★★★★★★★★★」inversedBy.

로 하면 요?mappedBy

로 하면 요?inversedBy

언제 둘 다 쓰면 안 돼요?

다음은 예를 제시하겠습니다.

 /**
 *
 * @ORM\OneToOne(targetEntity="\custMod\Entity\Person", mappedBy="customer")
 * @ORM\JoinColumn(name="personID", referencedColumnName="id")
 */
protected $person;

/**
 *
 * @ORM\OneToOne(targetEntity="\Auth\Entity\User")
 * @ORM\JoinColumn(name="userID", referencedColumnName="id")
 */
protected $user;

/**
 *
 * @ORM\ManyToOne (targetEntity="\custMod\Entity\Company", inversedBy="customer")
 * @ORM\JoinColumn (name="companyID", referencedColumnName="id")
 */
protected $company;

퀵 검색 결과, 다음과 같이 되어 있습니다만, 아직 혼란스럽습니다.

  • mappedBy는 (양방향) 어소시에이션의 반전측에서 지정해야 합니다.
  • inversedBy는 (양방향) 관련성을 소유하는 측에서 지정해야 합니다.

원칙 문서:

  • ManyToOne은 항상 쌍방향 어소시에이션의 소유측입니다.
  • OneToMany는 항상 쌍방향 어소시에이션의 반대쪽입니다.
  • OneToOne 어소시에이션의 소유측은 외부 키가 포함된 테이블이 있는 엔티티입니다.

https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork-associations.html 를 참조해 주세요.

위의 답변들은 제가 무슨 일이 일어나고 있는지 이해하기에는 충분하지 않았기 때문에, 좀 더 자세히 살펴본 결과, 저처럼 고생한 사람들이 이해할 수 있도록 설명할 수 있는 방법이 있다고 생각합니다.

inversedBy 및 mappedBy는 INTERNAL PRINTIN 엔진에 의해 사용되며 필요한 정보를 얻기 위해 수행해야 하는 SQL 쿼리 수를 줄입니다.inversedBy 또는 mappedBy를 추가하지 않으면 코드가 계속 작동하지만 최적화되지는 않습니다.

예를 들어 다음 클래스를 살펴보겠습니다.

class Task
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="task", type="string", length=255)
     */
    private $task;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dueDate", type="datetime")
     */
    private $dueDate;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="tasks", cascade={"persist"})
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;
}

class Category
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="Task", mappedBy="category")
     */
    protected $tasks;
}

는 스키마를 를 들어 " " " 등bin/console doctrine:schema:update --force --dump-sql에) (열.) (열 주석이 없습니다.)

여기서 이해해야 할 중요한 것은 변수 태스크는 오직 거기 있기 때문에 내부 교리 엔진은 mappedBy Category라고 하는 위의 참조를 사용할 수 있다는 것입니다.자... 여기서 내가 그랬던 것처럼 혼란스러워 하지 마...범주가 클래스 이름을 참조하는 것이 아니라 'protected $category'라는 작업 클래스의 속성을 참조하는 것입니다.

마찬가지로 Tasks 클래스에서 속성 $category는 inversedBy="tasks"라고 언급합니다. 이것은 복수이며, 이것은 MUPLE THE CLASS NAME이 아니라 Category 클래스에서 속성이 'protected $tasks'라고 불립니다.

이를 이해하면 inversedBy와 mappedBy의 동작과 이 상황에서 사용하는 방법을 쉽게 이해할 수 있습니다.

예제에서 'backwards'와 같은 외부 키를 참조하는 측에서는 항상 inversedBy 속성을 얻습니다. 왜냐하면 targetEntity 명령을 통해 해당 클래스의 어떤 클래스와 어떤 변수(inversedBy=)를 알아야 범주 정보를 얻을 수 있기 때문입니다.이를 기억하기 쉬운 방법은 foreignkey_id를 가진 클래스가 inversedBy를 가져야 한다는 것입니다.

카테고리와 마찬가지로 $tasks 속성이 MappedBy 'tasks'인 경우(테이블에 기재되어 있지 않고 최적화를 위해 클래스의 일부만 해당), 이를 통해 두 엔티티 간의 관계가 공식적으로 생성되므로 이제 교리는 두 개의 개별 SELECT 문 대신 JOIN SQL 문을 안전하게 사용할 수 있습니다.mappedBy가 없으면 교리 엔진은 JOIN 문을 통해 범주 정보를 넣을 클래스 '태스크' 변수를 만들 수 없습니다.

이게 좀 더 잘 설명해 주길 바라.

쌍방향 관계에는 소유측과 반대측의 양쪽이 있습니다.

mappedBy : 쌍방향 관계의 역방향으로 들어갑니다.엔티티의 소유측의 필드를 참조하려면

inversedBy : 쌍방향 관계의 소유 측에 배치되어 엔티티의 반대쪽에 있는 필드를 참조합니다.

그리고.

OneToOne, OneToMany 또는 ManyToMany 매핑 선언에서 사용되는 mappedBy 속성.

OneToOne, ManyToOne 또는 ManyToMany 매핑 선언에서 사용되는 inversedBy 속성.

주의: 쌍방향 관계의 소유측과 외부 키를 포함하는 측.

inversedBy 및 mappedBy에 대한 두 가지 참조: 첫 번째 링크, 두 번째 링크

5.9.1 소유측과 반대측

다대다 연결의 경우 소유 엔티티와 반대쪽 엔티티를 선택할 수 있습니다.개발자의 관점에서 어느 쪽이 소유자가 되기 더 적합한지를 결정하는 매우 간단한 의미 규칙이 있습니다.연결 관리를 담당하는 엔티티가 무엇인지 자문하고 해당 엔티티를 소유 측으로 선택하면 됩니다.

문서와 태그의 두 엔티티의 예를 들어 보겠습니다.문서를 태그에 연결하거나 그 반대로 연결하려는 경우 대부분 해당 문서가 이러한 관계를 담당합니다.새 문서를 추가할 때마다 기존 태그 또는 새 태그와 연결합니다.문서 작성 양식에서 이 개념을 지원하며 태그를 직접 지정할 수 있습니다.따라서 코드를 보다 쉽게 이해할 수 있도록 문서를 소유 측으로 선택해야 합니다.

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

언급URL : https://stackoverflow.com/questions/12493865/what-is-the-difference-between-inversedby-and-mappedby