В чем разница между @Entity и @embeddable

Разница между @entity и @embeddable аннотацией, когда каждый добавлен до объявления класса?

  • первый класс create в качестве объекта, второй столбец вставки из другой таблицы?
  • первый класс create в качестве таблицы, а второй - в другой класс?
  • первый устанавливает стандарт как класс, второй определяет тип таблицы
  • первая создающая таблица для этого класса, вторая вставлять что-то в другой класс
  • первое свойство define table, второе - объединение двух таблиц

Ответ 1

@Entity аннотация по классу определяет, что она имеет отдельное существование. Таким образом, мы можем запускать запросы БД, не зависимо от каких-либо других классов. @Embeddable аннотация по классу определяет, что она не имеет независимого существования. Таким образом, мы не можем запускать запросы БД, не зависимо от другого класса. Вот пример, чтобы лучше понять это:

@Entity
User
  -- long id
  -- String name
  -- String email
     @Embedded
  -- UserDetails userDetail

@Embeddable
UserDetails
  -- Date dateOfBirth
  -- String sex
  -- String address
  -- String maritalStatus

Здесь вы можете видеть, не имея User, UserDetails бесполезно.

Как правило, в ООП мы сначала разрабатываем классы, а затем создаем объекты базы данных. Для некоторых классов (например, класса UserDetails в приведенном выше примере) мы не хотим иметь отдельные таблицы в БД, где их независимое существование бессмысленно. В этих случаях мы отмечаем класс как вложенный.

Как правило, встраиваемые классы используют одну и ту же таблицу, чем Entity, в которую они встроены

Ответ 2

Сущности имеют тождество и могут быть запрошены. Встраиваемые не имеют собственной личности и могут быть запрошены только для использования принадлежащих им объектов.

Если вы откроете класс сущности, вы всегда найдете аннотацию @Id - это обязательно. Если вы откроете вложенный класс, вы никогда не найдете аннотацию @Id - это запрещено.

EDIT: Не совсем верно, что встраиваемые файлы могут храниться только как часть родительского элемента, то есть в той же таблице. Это справедливо только для отношений "один к одному". У вас могут быть Collections и Maps встраиваемых объектов в родительский объект, и они будут сопоставлены с собственными таблицами коллекции.

Ответ 3

Класс сущности - это обычный пользовательский Java-класс, экземпляры которого могут храниться в базе данных.

@Entity
@Table(name="dog")
public class Dog{
    @Id
    @Column(name = "id")
    private int id;

    @Embedded
    private Animal animal;
    public Dog(int id,Animal animal){
        this.id=id;
        this.animal=animal;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Animal getAnimal() {
        return animal;
    }
    public void setAnimal(Animal animal) {
        this.animal = animal;
    }
}

Встраиваемые классы - это определяемые пользователем устойчивые классы, которые функционируют как типы значений. Как и в случае с другими типами не-сущностей, экземпляры внедряемого класса могут храниться только в базе данных как внедренные объекты, т.е. Как часть объекта объекта сущности.

@Embeddable
public class Animal {

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

    @Column(name = "location")
    private String location;
    public Animal(){
    }
    public Animal(String name,String location){
        this.name=name;
        this.location=location;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
}

Ответ 4

Это старая тема, но я хотел бы добавить свой ответ, который больше с теоретической точки зрения. В DDD (доменный дизайн) мы обычно имеем Entity и Value Objects. Первые можно идентифицировать только с помощью a identity, которые они имеют. Второе не определяется идентификатором, а это означает, что если все компоненты, которые делают эти конкретные объекты одинаковыми, чем 2 значения, являются одинаковыми.

Аналогия заключается в том, что в этом случае, если бы мы применяли DDD, Entity - это класс, аннотированный с помощью @Entity, а Value Object - с @Embeddable. Демонстрация этого заключается в том, что встраиваемый объект добавляется как добавленная информация в существующую запись, которая уже имеет its own identity, внешне установленную для встроенного объекта.

Ответ 5

Ну, @Entity означает, что объект-сущность имеет значение сам по себе, он не требует дальнейшей связи с любым другим объектом. Если объект @Embeddable сам по себе не имеет никакого значения, ему требуется ассоциация с каким-либо другим объектом.

Давайте возьмем пример, скажем, у меня есть объект Employee, и он имеет коллекцию Address Object в качестве своей переменной-члена. Теперь, когда мы говорим о каком-либо адресе, нам нужно сказать, чей это адрес, какие сотрудники его адресуют. Если мы просто поговорим об адресе, это не имеет никакого смысла. Надеюсь, что это даст вам разницу между ними.