Я пытаюсь работать с @EmbeddedId, это мой код следующим образом:

create table TBL_EMPLOYEE_002(
  ID integer generated always as identity (start with 100,increment by 10), 
  COUNTRY varchar(50),
  NAME varchar(50),
  constraint PK_EMP_00240 primary key(ID,COUNTRY)
)

Класс Embedded следующим образом:

@Embeddable
public class EmployeeIdTwo implements Serializable{
     public EmployeeIdTwo(){}
    public EmployeeIdTwo(String country){
        this.empCountry = country;
    }

    @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="ID") 
    private Integer employeeId;

    @Column(name="COUNTRY",length=50)
    private String empCountry;

// implementation of hashCode and equals and only getters 
...
}

Сущность-сотрудник, как указано ниже,

@Entity
@Table(name="TBL_EMPLOYEE_002")
public class EmployeeEntitySix implements Serializable{

    public EmployeeEntitySix(){}
    public EmployeeEntitySix(EmployeeIdTwo id,String name){
        this.id = id;
        this.employeeName = name;
    }

    @EmbeddedId    
    private EmployeeIdTwo id;

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

// getters and setters
}

Это код, написанный в основном методе,

private static void storVal(EntityManager em){
    EmployeeEntitySix employee = new EmployeeEntitySix(new EmployeeIdTwo("KENYA"), "Henry Olaanga");
    em.persist(employee);
}

Но как только я запускаю приведенный выше код, я получаю исключение следующим образом:

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: Attempt to modify an identity column 'ID'. 

Не могли бы вы сообщить мне, где я ошибаюсь, если мой класс EmbeddedId содержит автоматически сгенерированный столбец, чем должен быть подход.

Просто чтобы знать, что я использую спящий режим в качестве поставщика сохраняемости и JPA в качестве API сохранения состояния.

3
Rahul Shivsharan 29 Мар 2013 в 14:35

1 ответ

Лучший ответ

Я предполагаю, что вы бы не задавали этот вопрос, если бы Id мог легко и однозначно идентифицировать сотрудника. Если у вас есть возможность изменять свои таблицы, я бы предложил либо сделать Id надежно уникальным, либо добавить автоматически сгенерированный столбец UniqueId.

Некоторые из этих ошибок на самом деле происходят из схемы БД, а не из JPA / Hibernate. Если вы пытаетесь обновить столбец, для которого у БД нет стратегии генерации, это может быть причиной вашей ошибки.

Вы также можете взглянуть на идентификатор автоинкремента не отражает в составном ключе с использованием JPA, поскольку я думаю, что это охватывает то, о чем вы спрашиваете.

0
Community 23 Май 2017 в 14:49