powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate namingstrategy
7 сообщений из 7, страница 1 из 1
Hibernate namingstrategy
    #40060427
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Entity:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Customers")
public class Customer {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String firstName;
	private String lastName;
	@Column(name = "email")
	private String emailAddress;

	public Long getId() {
		return id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getEmailAddress() {
		return emailAddress;
	}

	public void setEmailAddress(String emailAddress) {
		this.emailAddress = emailAddress;
	}

}



Таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `customers` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) DEFAULT NULL,
  `last_name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;



Настройки EntityManagerFactory:
Код: java
1.
2.
hibernate.physical_naming_strategy = xxx.naming_strategy.CustomPhysicalNamingStrategy
hibernate.hbm2ddl.auto = none



Класс CustomPhysicalNamingStrategy
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {

	@Override
	public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	@Override
	public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
		return convertToSnakeCase(identifier);
	}

	private Identifier convertToSnakeCase(final Identifier identifier) {
		if (identifier != null) {
			final String regex = "([a-z])([A-Z])";
			final String replacement = "$1_$2";
			final String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase();

			return Identifier.toIdentifier(newName);
		} else {
			return null;
		}
	}
}



Тестовый код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		doInJPA(entityManager -> {

			Customer customer = new Customer();
			customer.setEmailAddress("Some@mail.com");
			customer.setFirstName("FirstName");
			customer.setLastName("LastName");

			entityManager.persist(customer);

		});



Hibernate log выполнения тестового кода:
Код: java
1.
2.
3.
4.
Hibernate: alter table Customers add column firstName varchar(255)
Hibernate: alter table Customers add column lastName varchar(255)

Hibernate: insert into customers (email, first_name, last_name) values (?, ?, ?)



Коротко как должно быть:

В Hibernate применяется двухступеньчатая стратегия именования таблиц и полей:
1) Определение логического имени.
2) Определение физического имени.

На первом этапе определяются логические имена (ImplicitNamingStrategy = default):
Код: java
1.
2.
3.
4.
	private String firstName;           - логическое имя в таблице "firstName"
	private String lastName;            - логическое имя в таблице "lastName"
	@Column(name = "email")
	private String emailAddress;      - логическое имя в таблице "email"



На втором этапе на основании логических имен должны получить физические (используется hibernate.physical_naming_strategy = xxx.naming_strategy.CustomPhysicalNamingStrategy, которая заменяет кэмалкейс на нижнее подчеркивание и заменяет заглавные буквы прописными)

Код: java
1.
2.
3.
4.
	private String firstName;           - логическое имя в таблице "firstName",  физ. имя = "first_name"
	private String lastName;            - логическое имя в таблице "lastName",  физ. имя = "last_name"
	@Column(name = "email")
	private String emailAddress;      - логическое имя в таблице "email",  физ. имя = "email"



Ну и в примере должно произвестить вставка записи в колонки с физ именами. Это и происходит:
Код: java
1.
Hibernate: insert into customers (email, first_name, last_name) values (?, ?, ?)



Но почему перед этим происходит еще добавление двух колонок?:
Код: java
1.
2.
Hibernate: alter table Customers add column firstName varchar(255)
Hibernate: alter table Customers add column lastName varchar(255)
...
Рейтинг: 0 / 0
Hibernate namingstrategy
    #40060435
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если явно задать имена колонок:
Код: java
1.
2.
3.
4.
@Column(name = "firstName")
private String firstName;
@Column(name = "lastName")
private String lastName;

, то результат тот же.
...
Рейтинг: 0 / 0
Hibernate namingstrategy
    #40060453
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отбой, у меня косяк был. Все работает как положено.
...
Рейтинг: 0 / 0
Hibernate namingstrategy
    #40061384
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
могу сказать нейкий лайф хак - некие анотации ,которые именуются идентично в пакете перситстенс и в пакете хибера работают по разному- и это надо учитывать


я тут запарился и смог с помощью хибера вызывать хранимые процедуры с параметрами,причем видимость настраиваемая-очень крутая штука- такое мало кто умеет- а по факту можно почти половину логики вынести на бд сервак - решив тем самым проблему производительности в каких то случаях,при этом не отазываться от ORM
...
Рейтинг: 0 / 0
Hibernate namingstrategy
    #40061403
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79,
Нет уж. Либо хранимки либо ОРМ.
...
Рейтинг: 0 / 0
Hibernate namingstrategy
    #40061461
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
asv79,
Нет уж. Либо хранимки либо ОРМ.

ничто не мешает использовать все вместе
...
Рейтинг: 0 / 0
Hibernate namingstrategy
    #40061555
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
PetroNotC Sharp
asv79,
Нет уж. Либо хранимки либо ОРМ.

ничто не мешает использовать все вместе
когда начинаешь рассуждать про архитектуру - получается плохо.
Вместе это Г....
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate namingstrategy
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]