0

У меня есть 3 поля класса сущности, которые я не хочу быть уникальными, но вместо этого я хочу, чтобы они использовались в качестве составных полей для ключа, который должен быть уникальным. Мой класс POJO:Проверка проверки на уникальный составной ключ

@Entity 
     @Table(name="EMPLOYEE") 
     public class Employee { 

      @Id 
      @GeneratedValue(strategy = GenerationType.IDENTITY) 
      private int id; 

      @Size(min=3, max=50) 
      @Column(name = "NAME", nullable = false) 
      private String name; 

      @Size(min=3, max=50) 
      @Column(name = "A", nullable = false) 
      private String a; 
      @Size(min=3, max=50) 
      @Column(name = "B", nullable = false) 
      private String b; 
      @Size(min=3, max=50) 
      @Column(name = "C", nullable = false) 
      private String c; 

      @NotNull 
      @DateTimeFormat(pattern="dd/MM/yyyy") 
      @Column(name = "JOINING_DATE", nullable = false) 
      @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate") 
      private LocalDate joiningDate; 

      @NotNull 
      @Digits(integer=8, fraction=2) 
      @Column(name = "SALARY", nullable = false) 
      private BigDecimal salary; 

      @NotEmpty 
      @Column(name = "SSN", unique=true, nullable = false) 
      private String ssn; 
    } 

Im работая с представлением формы, проверки ввода данных пользователем с помощью JSR303 аннотациями .В случае ошибки проверки, сообщения об ошибках по умолчанию являются shown.I сконфигурировано ResourceBundleMessageSource:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.fussa.fyby") 
public class AppConfig { 

    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setViewClass(JstlView.class); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Bean 
    public MessageSource messageSource() { 
     ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
     messageSource.setBasename("messages"); 
     return messageSource; 
    } 
} 

/src/main/resources/messages.properties

Size.employee.name=between {2} and {1} characters long 
NotNull.employee.joiningDate=can not be blank 
NotNull.employee.salary=are u working for free ! 
Digits.employee.salary=Only numeric data with max 8 digits and with max 2 precision is allowed 
NotEmpty.employee.ssn=can not be blank 
typeMismatch=Invalid format 
non.unique.ssn=SSN {0} already exist. 

я нашел это решение для создания уникального ключа:

@Table(name = "EMPLOYEE", 
     uniqueConstraints = { @UniqueConstraint(columnNames = { "A", "B", "C" }) }) 

мой вопрос, как я могу отобразить сообщение, используя messages.properties если UniqueConstraint было нарушено?

UPDATE 1

@Service("employeeService") 
@Transactional 
public class EmployeeServiceImpl implements EmployeeService { 

    @Autowired 
    private EmployeeDao dao; 

    //.... 

    public void saveEmployee(Employee employee) { 
     dao.saveEmployee(employee); 
    } 

} 

Спасибо за любые советы ..

+0

есть исключение, которое бросило, когда UniqueConstraint нарушается. если да, вы можете получить это исключение и отобразить любое сообщение, которое вы хотите. Просто сугестсион. –

ответ

0

мне удалось создать уникальные проверки ограничений для одного поля, folowing это шагов:

1- Создайте ограничение аннотации. 2-create Валидатор ограничений. 3-сообщение об ошибке. 4-как использовать ограничение.

я разместил код с решением здесь: Link ..

1

Если вы хотите использовать Bean Validation вам нужно будет написать пользовательское ограничение, которое проверяет, что три столбца является уникальным. Имейте в виду, есть проблема с этим. Если вы не заблокируете всю таблицу, у вас всегда будет проблема: если ваш проверочный механизм проверки проверяет уникальность, другая параллельная транзакция изменяет базу данных. См. Также этот вопрос в Stackoverflow - Unique constraint with JPA and Bean Validation. Существует blog post в Викиверситете Wiki о том, как могут выглядеть ограничения Unique, но в нем есть только что упомянутый оговорка. Проверка может пройти, но затем во время вставки вы все равно можете получить исключение уровня базы данных из-за того, что другая транзакция изменила данные за это время (поэтому ваш код также должен будет обрабатывать этот случай). Также с Bean Validation 1.1 вы, вероятно, можете просто ввести SessionFactory напрямую.

 Смежные вопросы

  • Нет связанных вопросов^_^